package arithmetic.LeetCode;

import org.junit.jupiter.api.Test;

/**
 * 找出数组中重复的数字。
 *
 *
 * 在一个长度为 n 的数组 nums 里的所有数字都在 0～n-1 的范围内。数组中某些数字是重复的，但不知道有几个数字重复了，
 * 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
 *
 * 输入：
 * [2, 3, 1, 0, 2, 5, 3]
 * 输出：2 或 3
 *
 * 链接：https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
 * @author jiangfeng on 2022/11/13
 */
public class RepeatElementLIst {

    @Test
    public void test() {
        System.out.println(findRepeatNumber(new int[] {2, 3, 1, 0, 2, 5, 3}));
    }

    // 原地算法
    public int findRepeatNumber(int[] nums) {
        int i = 0;
        while (i < nums.length) {
            while (nums[i] == i) {
                i++;
            }
            // 判断一下.
            if (nums[nums[i]] == nums[i]) {
                return nums[i];
            }
            // 替换
            int tmp = nums[nums[i]];
            nums[nums[i]] = nums[i];
            nums[i] = tmp;
        }
        return -1;

    }
}
